home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / gus / guspeak.zip / SAYNUM.C < prev    next >
C/C++ Source or Header  |  1993-06-24  |  5KB  |  210 lines

  1. #include <stdio.h>
  2.  
  3. /*
  4. **              Integer to Readable ASCII Conversion Routine.
  5. **
  6. ** Synopsis:
  7. **
  8. **      say_cardinal(value)
  9. **          long int     value;          -- The number to output
  10. **
  11. **    The number is translated into a string of phonemes
  12. **
  13. */
  14.  
  15. static char *Cardinals[] = 
  16.     {
  17.     "zIHrOW ",    "wAHn ",    "tUW ",        "THrIY ",
  18.     "fOWr ",    "fAYv ",    "sIHks ",    "sEHvAXn ",
  19.     "EYt ",        "nAYn ",        
  20.     "tEHn ",    "IYlEHvAXn ",    "twEHlv ",    "THERtIYn ",
  21.     "fOWrtIYn ",    "fIHftIYn ",     "sIHkstIYn ",    "sEHvEHntIYn ",
  22.     "EYtIYn ",    "nAYntIYn "
  23.     } ;
  24.  
  25. static char *Twenties[] = 
  26.     {
  27.     "twEHntIY ",    "THERtIY ",    "fAOrtIY ",    "fIHftIY ",
  28.     "sIHkstIY ",    "sEHvEHntIY ",    "EYtIY ",    "nAYntIY "
  29.     } ;
  30.  
  31. static char *Ordinals[] = 
  32.     {
  33.     "zIHrOWEHTH ",    "fERst ",    "sEHkAHnd ",    "THERd ",
  34.     "fOWrTH ",    "fIHfTH ",    "sIHksTH ",    "sEHvEHnTH ",
  35.     "EYtTH ",    "nAYnTH ",        
  36.     "tEHnTH ",    "IYlEHvEHnTH ",    "twEHlvTH ",    "THERtIYnTH ",
  37.     "fAOrtIYnTH ",    "fIHftIYnTH ",     "sIHkstIYnTH ",    "sEHvEHntIYnTH ",
  38.     "EYtIYnTH ",    "nAYntIYnTH "
  39.     } ;
  40.  
  41. static char *Ord_twenties[] = 
  42.     {
  43.     "twEHntIYEHTH ","THERtIYEHTH ",    "fOWrtIYEHTH ",    "fIHftIYEHTH ",
  44.     "sIHkstIYEHTH ","sEHvEHntIYEHTH ","EYtIYEHTH ",    "nAYntIYEHTH "
  45.     } ;
  46.  
  47.  
  48. /*
  49. ** Translate a number to phonemes.  This version is for CARDINAL numbers.
  50. **     Note: this is recursive.
  51. */
  52. void say_cardinal(long int value)
  53. {
  54.     if (value < 0)
  55.         {
  56.         outstring("mAYnAHs ");
  57.         value = (-value);
  58.         if (value < 0)    /* Overflow!  -32768 */
  59.             {
  60.             outstring("IHnfIHnIHtIY ");
  61.             return;
  62.             }
  63.         }
  64.  
  65.     if (value >= 1000000000L)    /* Billions */
  66.         {
  67.         say_cardinal(value/1000000000L);
  68.         outstring("bIHlIYAXn ");
  69.         value = value % 1000000000;
  70.         if (value == 0)
  71.             return;        /* Even billion */
  72.         if (value < 100)    /* as in THREE BILLION AND FIVE */
  73.             outstring("AEnd ");
  74.         }
  75.  
  76.     if (value >= 1000000L)    /* Millions */
  77.         {
  78.         say_cardinal(value/1000000L);
  79.         outstring("mIHlIYAXn ");
  80.         value = value % 1000000L;
  81.         if (value == 0)
  82.             return;        /* Even million */
  83.         if (value < 100)    /* as in THREE MILLION AND FIVE */
  84.             outstring("AEnd ");
  85.         }
  86.  
  87.     /* Thousands 1000..1099 2000..99999 */
  88.     /* 1100 to 1999 is eleven-hunderd to ninteen-hunderd */
  89.     if ((value >= 1000L && value <= 1099L) || value >= 2000L)
  90.         {
  91.         say_cardinal(value/1000L);
  92.         outstring("THAWzAEnd ");
  93.         value = value % 1000L;
  94.         if (value == 0)
  95.             return;        /* Even thousand */
  96.         if (value < 100)    /* as in THREE THOUSAND AND FIVE */
  97.             outstring("AEnd ");
  98.         }
  99.  
  100.     if (value >= 100L)
  101.         {
  102.         outstring(Cardinals[value/100]);
  103.         outstring("hAHndrEHd ");
  104.         value = value % 100;
  105.         if (value == 0)
  106.             return;        /* Even hundred */
  107.         }
  108.  
  109.     if (value >= 20)
  110.         {
  111.         outstring(Twenties[(value-20)/ 10]);
  112.         value = value % 10;
  113.         if (value == 0)
  114.             return;        /* Even ten */
  115.         }
  116.  
  117.     outstring(Cardinals[value]);
  118.     return;
  119. }
  120.  
  121.  
  122. /*
  123. ** Translate a number to phonemes.  This version is for ORDINAL numbers.
  124. **     Note: this is recursive.
  125. */
  126. void say_ordinal(long int value)
  127. {
  128.  
  129.     if (value < 0)
  130.         {
  131.         outstring("mAHnAXs ");
  132.         value = (-value);
  133.         if (value < 0)    /* Overflow!  -32768 */
  134.             {
  135.             outstring("IHnfIHnIHtIY ");
  136.             return;
  137.             }
  138.         }
  139.  
  140.     if (value >= 1000000000L)    /* Billions */
  141.         {
  142.         say_cardinal(value/1000000000L);
  143.         value = value % 1000000000;
  144.         if (value == 0)
  145.             {
  146.             outstring("bIHlIYAXnTH ");
  147.             return;        /* Even billion */
  148.             }
  149.         outstring("bIHlIYAXn ");
  150.         if (value < 100)    /* as in THREE BILLION AND FIVE */
  151.             outstring("AEnd ");
  152.         }
  153.  
  154.     if (value >= 1000000L)    /* Millions */
  155.         {
  156.         say_cardinal(value/1000000L);
  157.         value = value % 1000000L;
  158.         if (value == 0)
  159.             {
  160.             outstring("mIHlIYAXnTH ");
  161.             return;        /* Even million */
  162.             }
  163.         outstring("mIHlIYAXn ");
  164.         if (value < 100)    /* as in THREE MILLION AND FIVE */
  165.             outstring("AEnd ");
  166.         }
  167.  
  168.     /* Thousands 1000..1099 2000..99999 */
  169.     /* 1100 to 1999 is eleven-hunderd to ninteen-hunderd */
  170.     if ((value >= 1000L && value <= 1099L) || value >= 2000L)
  171.         {
  172.         say_cardinal(value/1000L);
  173.         value = value % 1000L;
  174.         if (value == 0)
  175.             {
  176.             outstring("THAWzAEndTH ");
  177.             return;        /* Even thousand */
  178.             }
  179.         outstring("THAWzAEnd ");
  180.         if (value < 100)    /* as in THREE THOUSAND AND FIVE */
  181.             outstring("AEnd ");
  182.         }
  183.  
  184.     if (value >= 100L)
  185.         {
  186.         outstring(Cardinals[value/100]);
  187.         value = value % 100;
  188.         if (value == 0)
  189.             {
  190.             outstring("hAHndrEHdTH ");
  191.             return;        /* Even hundred */
  192.             }
  193.         outstring("hAHndrEHd ");
  194.         }
  195.  
  196.     if (value >= 20)
  197.         {
  198.         if ((value%10) == 0)
  199.             {
  200.             outstring(Ord_twenties[(value-20)/ 10]);
  201.             return;        /* Even ten */
  202.             }
  203.         outstring(Twenties[(value-20)/ 10]);
  204.         value = value % 10;
  205.         }
  206.  
  207.     outstring(Ordinals[value]);
  208.     return;
  209. }
  210.